package br.com.mauricioreis.db;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;

public class Refeicao extends Entidade {
    public static final String DATABASE_TABLE = "refeicao";
    public static final String TABLE_CREATE = " create table refeicao (" + //
            "id integer primary key autoincrement, " + //
            "data datetime not null, " + //
            "id_perfil integer not null," + //
            "FOREIGN KEY(id_perfil) REFERENCES perfil(id)); ";

    private static final String[] COLUMNS = new String[] { GenericDAO.KEY_ID, "data", "id_perfil" };
    private int id;
    private Calendar data;
    private Integer idPerfil;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Calendar getData() {
        return data;
    }

    public void setData(Calendar data) {
        this.data = data;
    }

    public Integer getIdPerfil() {
        return idPerfil;
    }

    public void setIdPerfil(Integer idPerfil) {
        this.idPerfil = idPerfil;
    }

    public static Long incluir(Activity atividade, Refeicao refeicao) {

        GenericDAO dao = obtemDao(atividade);
        Long id = null;
        if (dao != null) {
            ContentValues values = toContentValues(refeicao);
            id = dao.inserir(DATABASE_TABLE, values);
            dao.close();
        }
        return id;
    }

    public static void editar(Activity atividade, Refeicao refeicao) {
        GenericDAO dao = obtemDao(atividade);
        ContentValues values = toContentValues(refeicao);
        dao.atualizar(DATABASE_TABLE, refeicao.getId(), values);
    }

    public static void excluir(Activity atividade, Refeicao refeicao) {
        GenericDAO dao = obtemDao(atividade);
        dao.deletar(DATABASE_TABLE, refeicao.getId());
    }

    public static Refeicao consultar(Activity atividade, Refeicao refeicao) {
        GenericDAO dao = obtemDao(atividade);
        Cursor cursor = dao.get(DATABASE_TABLE, COLUMNS, refeicao.getId());
        refeicao = cursorParaRefeicao(cursor);
        return refeicao;
    }

    private static Refeicao cursorParaRefeicao(Cursor cursor) {
        Refeicao refeicao = new Refeicao();
        int idColumn = cursor.getColumnIndex(GenericDAO.KEY_ID);
        int dataColumn = cursor.getColumnIndex("data");
        int idPerfilColumn = cursor.getColumnIndex("id_perfil");
        refeicao.setId(cursor.getInt(idColumn));
        refeicao.setData(Util.stringParaCalendar(cursor.getString(dataColumn)));
        refeicao.setIdPerfil(cursor.getInt(idPerfilColumn));

        return refeicao;
    }

    public static List<Refeicao> listar(Activity atividade, Refeicao refeicao) {
        Cursor cursor = null;
        List<Refeicao> list = new ArrayList<Refeicao>();
        GenericDAO dao = obtemDao(atividade);

        if (dao != null) {
            cursor = dao.get(DATABASE_TABLE, COLUMNS);
            if (cursor != null && cursor.moveToFirst()) {
                int count = cursor.getCount();
                for (int i = 0; i < count; i++) {
                    Refeicao refeicaoRet = cursorParaRefeicao(cursor);

                    list.add(refeicaoRet);
                    cursor.moveToNext();
                }
            }
        }
        return list;
    }

    private static ContentValues toContentValues(Refeicao refeicao) {
        ContentValues values = new ContentValues();
        values.put("data", Util.calendarParaString(refeicao.getData()));
        values.put("id_perfil", refeicao.getIdPerfil());
        return values;
    }

    @Override
    public String toString() {
        return Util.calendarParaStringDeView(this.data);
    }

    private static GenericDAO obtemDao(Activity atividade) {
        return GenericDAO.getInstance(atividade, DATABASE_NAME, TABLE_CREATE, DATABASE_TABLE, DATABASE_VERSION);
    }

    /**
     * Lista as refeições da data informada
     * 
     * @param atividade
     * @param data
     *            formato yyyy-MM-dd
     * @return
     */
    public static List<Refeicao> listar(Activity atividade, String data) {
        List<Refeicao> list = new ArrayList<Refeicao>();
        String sql = "SELECT * FROM refeicao WHERE " + //
                " data LIKE '" + data + "%'";

        GenericDAO dao = obtemDao(atividade);
        Cursor cursor = dao.getComQuery(sql, null);
        if (cursor != null && cursor.moveToFirst()) {
            int count = cursor.getCount();
            for (int i = 0; i < count; i++) {
                Refeicao refeicaoRet = cursorParaRefeicao(cursor);

                list.add(refeicaoRet);
                cursor.moveToNext();
            }
        }
        return list;
    }

}
